#include "paneltabla.h"
#include "dialogo.h"
#include "ui_paneltabla.h"
#include "tablaitemdelegate.h"

PanelTabla::PanelTabla(QWidget *parent) : QWidget(parent), ui(new Ui::PanelTablaClass)
{
    ui->setupUi(this);

    ui->tabla->installEventFilter(this);

    setFuncionalidad(TABLA_NINGUNA);
    actualizarBotones();

    setFocusProxy(ui->tabla);

    ui->tabla->setItemDelegate(new TablaItemDelegate(&formateadorTabla, ui->tabla));
}

PanelTabla::~PanelTabla()
{
    ui->tabla->removeEventFilter(this);
    delete ui;
}


void PanelTabla::inicializar()
{
    connect(ui->botonAnadir, SIGNAL(clicked()), this, SIGNAL(anadir()));
    connect(ui->botonNuevo, SIGNAL(clicked()), this, SIGNAL(nuevo()));
    connect(ui->botonModificar, SIGNAL(clicked()), this, SIGNAL(modificar()));
    connect(ui->botonCopiar, SIGNAL(clicked()), this, SIGNAL(copiar()));
    connect(ui->botonEliminar, SIGNAL(clicked()), this, SIGNAL(eliminar()));
    connect(ui->botonSubir, SIGNAL(clicked()), this, SIGNAL(subir()));
    connect(ui->botonBajar, SIGNAL(clicked()), this, SIGNAL(bajar()));
    connect(ui->tabla, SIGNAL(clicked(const QModelIndex&)), this, SIGNAL(seleccionado()));

    QAbstractItemModel* modelo = ui->tabla->model();
    if (modelo != NULL) {
        connect(modelo, SIGNAL(layoutChanged()), this, SLOT(actualizarBotones()));
    }
    QItemSelectionModel* modeloSeleccion = ui->tabla->selectionModel();
    if (modeloSeleccion != NULL) {
        connect(modeloSeleccion, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
            this, SLOT(actualizarBotones()));
    }
}

void PanelTabla::setMargen(int margen)
{
     ui->layoutPrincipal->setContentsMargins(margen, margen, margen, margen);
}

void PanelTabla::setFuncionalidad(short funcionalidad) 
{
    this->funcionalidad = funcionalidad;

    ui->botonNuevo->setVisible(funcionalidad & TABLA_NUEVO);
    ui->botonAnadir->setVisible(funcionalidad & TABLA_ANADIR);    
    ui->botonModificar->setVisible(funcionalidad & TABLA_MODIFICAR);
    ui->botonCopiar->setVisible(funcionalidad & TABLA_COPIAR);
    ui->botonEliminar->setVisible(funcionalidad & TABLA_ELIMINAR);
    ui->botonSubir->setVisible(funcionalidad & TABLA_SUBIR);
    ui->botonBajar->setVisible(funcionalidad & TABLA_BAJAR);
    ui->panelBotonesEdicion->setVisible(funcionalidad & TABLA_EDITAR);
    ui->panelBotonesOrdenacion->setVisible(funcionalidad & TABLA_ORDENAR);
    ui->tabla->setSortingEnabled(!(funcionalidad & TABLA_ORDENAR));
}

void PanelTabla::setFormateador(Formateador* formateador)
{
    ui->tabla->setItemDelegate(new TablaItemDelegate(formateador, ui->tabla));
}

QTableView* PanelTabla::getTabla()
{
    return ui->tabla;
}

QWidget* PanelTabla::getFiltros()
{
    return ui->filtros;
}

void PanelTabla::on_tabla_doubleClicked()
{
    if (funcionalidad & TABLA_SELECCIONAR) {
        QWidget* ventana = window();
        Aceptable* ventanaAceptable = dynamic_cast<Aceptable*>(ventana);
        if (ventanaAceptable != NULL) {
            ventanaAceptable->aceptar();
        }
    } else if (funcionalidad & TABLA_MODIFICAR) {
        emit modificar();
    }
}

bool PanelTabla::aceptar()
{
    if (!(funcionalidad & TABLA_SELECCIONAR)) {
        return true;
    }
    if (ui->tabla->selectionModel()->selectedIndexes().isEmpty()) {
        Dialogo::mostrarMensaje(this, "Debe seleccionar un elemento antes de aceptar", MOSTRAR_AVISO);
        return false;
    }

    return true;
}

void PanelTabla::actualizarBotones()
{
    QAbstractItemModel* modelo = ui->tabla->model();
    int fila = ui->tabla->currentIndex().row();

    bool haySeleccion = fila >= 0;
    bool primeroSeleccionado = fila == 0;
    bool ultimoSeleccionado = modelo == NULL ? false : fila == modelo->rowCount() - 1;
    //bool vacio = modelo == NULL ? true : modelo->rowCount() == 0;

    ui->botonSubir->setEnabled(haySeleccion && !primeroSeleccionado);
    ui->botonBajar->setEnabled(haySeleccion && !ultimoSeleccionado);
    ui->botonModificar->setEnabled(haySeleccion);
    ui->botonEliminar->setEnabled(haySeleccion);
}

bool PanelTabla::eventFilter(QObject *recv, QEvent *event)
{
    if (recv != ui->tabla || event->type() != QEvent::KeyPress) {
        return false;
    }
    QKeyEvent *evento = static_cast<QKeyEvent*>(event);
    switch (evento->key()) {
        case Qt::Key_Delete:
            emit eliminar();
            return true;
        //case Qt::Key_Insert:
        //    emit nuevo();
        //    return true;
        case Qt::Key_F5:
            emit actualizar();
            return true;
    }
    return false; 
}

void PanelTabla::agregarBoton(QPushButton* boton)
{
    boton->setParent(ui->panelBotonesEdicion);
    ui->layoutInferior->addWidget(boton);

    listaBotonesAnadidos.append(boton);

    actualizarBotones();
}
